/*
 * Texture.h
 *
 *  Created on: 2011/07/06
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_GRAPHICS_TEXTURE_H
#define INCLUDED_NTENGINE_GRAPHICS_TEXTURE_H

namespace NTEngine {
namespace Xml {
	class ConstElement;
} // namespace PseudoXml
namespace Graphics {

/**
 * @brief テクスチャを扱います
 */
class Texture {
public:
	/**
	 * @brief エレメントから生成。pathがあればファイル名の前に追加する。
	 */
	static Texture create( Xml::ConstElement, const char* path = 0 );

	/**
	 * @brief ファイルからテクスチャを生成します
	 */
	static Texture create( const char* fileName );

	/**
	 * @brief 空のテクスチャを生成します
	 */
	static Texture create( int w, int h, bool createMipChain );

	/**
	 * TGAもしくはDDSの中身を渡す。最初にDDSと書いてあればDDSとみなし、それ以外はTGAとみなす。
	 */
	static Texture create( const char* fileData, int fileSize );

	/**
	 * 書き込み用バッファをロックします。
	 */
	void lock( unsigned** surface, int* pitch, int mipmapLevel );

	/**
	 * 書き込み用バッファを部分ロックします。
	 */
	void lock( unsigned** surface, int* pitch, int x, int y, int w, int h, int mipmapLevel );

	/**
	 * 書き込み用バッファをアンロックします。
	 */
	void unlock( int mipmapLevel );

	/**
	 * @brief 名前ゲット(Xmlからロードすればその名前。他は空。)
	 */
	const char* name() const;

	/**
	 * @brief テクスチャのサイズを取得します
	 */
	int width() const;

	/**
	 * @brief テクスチャのサイズを取得します
	 */
	int height() const;

	/**
	 * @brief テクスチャのオリジナルサイズを取得します。
	 */
	int originalWidth() const;

	/**
	 * @brief テクスチャのオリジナルサイズを取得します。
	 */
	int originalHeight() const;

	/**
	 * @brief テクスチャが使用できるか調べます
	 */
	bool isReady();

	/**
	 * @brief エラー状態を返します
	 */
	bool isError() const;

	// 以下、ユーザは気にしないもの
	Texture();
	~Texture();
	Texture( const Texture& );
	void release();
	Texture& operator=( const Texture& );
	bool operator==( const Texture& ) const;
	bool operator!=( const Texture& ) const;
	bool operator<( const Texture& ) const;
	int referenceCount() const;
	operator void*() const;
	class Impl;
	Texture( const Impl* );
private:
	friend class Manager;
	Impl* mImpl;
};

} // namespace Graphics
} // namespace NTEngine

#endif // INCLUDED_NTENGINE_GRAPHICS_TEXTURE_H
